package com.atguigu.gmall.mq.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.common.service.RabbitService;
import com.atguigu.gmall.mq.config.DeadLetterConfig;
import com.atguigu.gmall.mq.config.DelayedConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * @author wk
 * @create 2021-09-12 17:44
 * 消息提供方
 * 延迟消息的实现方式：
 * 1.基于死信实现
 * 缺点：延迟时间不一样 只能以前面的消息的延迟时间为准
 * 2.基于插件实现
 * 缺点：3.8旧版本存在bug 可能会造成队列一直应答失败 消息重复挤压在交换机中
 * 优点：可以发送不同时段的延迟消息
 */
@RestController
@RequestMapping
public class SendMessageController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private RabbitService rabbitService;

    // 发送正常消息
    @GetMapping("/sendMessage/{message}")
    public Result sendMessage(@PathVariable String message) {
        //rabbitTemplate.convertAndSend("testexchange","testroutingkey2",message);
        // 调用自定义且含有CorrelationData对象的方法发送消息
        rabbitService.sendMessage("testexchange", "testroutingkey", message);
        return Result.ok();
    }

    /**
     * 死信：也就是一些无法被消费的消息
     * 出现死信的情况：
     * 1.消息数量超出了队列的长度
     * 2.超过了消息的过期时间 长时间未被消费
     * 3.消费者拒绝消费消息
     * 解决方案：
     * 通过死信队列，由负责监听死信的应用程序进行处理
     *
     * @param message
     * @return
     */
    // 发送延迟消息 基于死信
    @GetMapping("/sendDeadLetterMessage/{message}")
    public Result sendDeadLetterMessage(@PathVariable String message) {
        // 调用自定义且含有CorrelationData对象的方法发送消息
        System.out.println("发送消息的时间" + new Date().getTime());
        rabbitService.sendDeadLetterMessage(DeadLetterConfig.exchange_dead, DeadLetterConfig.routing_dead_1,
                message, 10);
        return Result.ok();
    }

    // 发送延迟消息 基于插件
    @GetMapping("/sendDelayedMessage/{message}")
    public Result sendDelayedMessage(@PathVariable String message) {
        // 调用自定义且含有CorrelationData对象的方法发送消息
        System.out.println("发送消息的时间" + new Date());
        rabbitService.sendDelayedMessage(DelayedConfig.exchange_delay, DelayedConfig.routing_delay,
                message, 10);
        return Result.ok();
    }
}
